6. 변수 캡슐화하기
- 접근 범위가 넓은 데이터를 그 데이터로의 접근을 독점하는 함수로 캡슐화
- 불변 데이터는 변경될 일이 없기 때문에 캡슐화 불필요
절차
- 변수의 접근과 갱신을 전담하는 함수 선언
- 정적 검사 수행
- 변수에 직접 참조하던 부분을 모두 캡슐화 함수 호출로 수정
- 수정할 때마다 테스트
- 변수의 접근 범위를 제한
- 같은 모듈로 옮기고 접근함수만 export
- 테스트
- 원본 데이터의 변경이 필요할 때
- getter에서 데이터 복제 후 전달
- 레코드 캡슐화하기 (클레스로 감싸기)
- 주의 nested object일 경우 불충분할 수 있음
예시 코드
let defaultAgreements = [
]
😞 Before
class Agreements {
constructor() {
this._agreements = defaultAgreements
}
get agreements() {return this._agreements}
setAgreements(arg) {this._agreements = arg}
handleAgreementChange(id) {
this.agreements.some((item) => {
if (item.id === id) {
item.checked = !item.checked
}
return item.id === id
})
}
handleAgreementAllChange() {
this.agreements.forEach((item) => {
item.checked = true
})
}
}
😃 After
const agreements = () => cloneDeep(defaultAgreements)
class Agreements {
constructor() {
this._agreements = agreements()
}
get agreements() {return this._agreements}
setAgreements(arg) {this._agreements = arg}
handleAgreementChange(id) {
this.agreements.some((item) => {
if (item.id === id) {
item.checked = !item.checked
}
return item.id === id
})
}
handleAgreementAllChange() {
const nextList = this.agreements.map((item) => {
item.checked = true
return item
})
this.setAgreements(nextList)
}
}